// 封装axios
import router from '@/router'
import { useUserStore } from '@/stores'
import { showToast } from 'vant'
import axios, { type Method } from 'axios'
// 定义基准路径
const baseURL = 'https://consult-api.itheima.net/'
// 创建实例
const instance = axios.create({
  baseURL,
  timeout: 5000
})
// 请求拦截器（处理token）
instance.interceptors.request.use((config) => {
  // 如果用户仓库数据中带有 token 注入到请求头中
  const store = useUserStore()
  if (store.user?.token && config.headers) {
    config.headers.Authorization = `Bearer ${store.user.token}`
  }
  return config
})

// 响应拦截器（处理错误）
// 可以接收两个参数，一个处理响应码200，一个处理其他硬性报错
instance.interceptors.response.use(
  (res) => {
    // todo分开处理数据成功或失败
    // 请求成功，数据也成功
    if (res.data.code === 10000) {
      // 数据正确
      return res.data
    } else {
      // 请求成功，数据失败
      showToast(res.data.message)
      return Promise.reject(res.data)
    }
  },
  (err) => {
    // 硬性错误
    // 要在错误处阻止当前promise的继续执行
    // todo的错误有很多，特别要处理token失效问题(被动介入)
    if (err.response.status === 401) {
      // 清理用户数据
      const store = useUserStore()
      store.delUser()
      router.push({
        path: '/login',
        query: { returnUrl: router.currentRoute.value.fullPath }
      })
    }
    showToast(err.message)
    return Promise.reject(err)
  }
)

type ResponseData<T> = {
  code: number
  message: string
  data: T
}
// 封装request
const request = <T>(
  url: string,
  method: Method = 'get',
  submitData?: object
) => {
  return instance<T, ResponseData<T>>({
    url,
    method,
    [method.toLowerCase() === 'get' ? 'params' : 'data']: submitData
  })
}
// 暴露实例
export { instance, request }
